package com.okaixz.client.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.okaixz.client.model.domain.User;
import com.okaixz.client.model.dto.*;
import com.okaixz.client.model.vo.CommonInfoVo;

/**
 * <p>
 * APP用户信息表 服务类
 * </p>
 *
 * @author cdz
 * @since 2024-10-08
 */
public interface IUserService extends IService<User> {



    UserDto fillVipFlag(UserDto userDto);
    void reduceRemainTimes(UserDto userDto);
    void reduceTokens(UserDto userDto,int reduceTokens);
    /**
     * 更新用户信息 同时会将用户信息保存到redis 不更新token
     * @param user
     * @return
     */
    boolean updateUserByUserId(User user);
    /**
     * 更新用户信息 同时会将用户信息保存到redis
     * @param user
     * @return
     */
    UserDto updateUserInfoByUserId(UpdateUserDto user);
    /**
     * 更新用户信息 同时会将用户信息保存到redis 会更新token
     * @param user
     * @return
     */
    UserDto updateUserInfoByUserId(UserDto user);
    /**
     * 更新用户信息 同时会将用户信息保存到redis 会更新token
     * @param user
     * @return
     */
    UserDto updateUserInfoByUserId(User user);
    /**
     * 更新用户性别
     * @param user
     * @return
     */
    UserDto kbUpdateUserSex(UpdateUserDto user);

    /**
     * 新增或更新用户信息 同时会将用户信息保存到redis
     * @param user
     * @return
     */
    boolean saveOrUpdateUser(User user);

    UserDto saveHead(UserDto userDto);

    String wxQrcode();

    UserDto updateVipInfo(Integer gid, String userId);

    /**
     * 更新用户vip到期时间
     * @param value 加减的天数
     * @param userId
     * @return
     */
    UserDto updateVipExpireTime(Integer value, String userId);

    /**
     * 从数据库中查询用户信息
     * @param userId
     * @return
     */
    User getUserByUserIdFromDB(String userId);

    /**
     * 从redis缓存中获取用户信息
     * @param userId
     * @return
     */
    User getUserFromRedis(String userId);
    /**
     * 先从redis缓存中取user 如果没有再从数据库中取
     * @param userId
     * @return
     */
    User getUserFormRedisOrDb(String userId);
    /**
     * 先从redis缓存中取user 如果没有再从数据库中取
     * @param userId
     * @return
     */
    UserDto getUserDtoFormRedisOrDb(String userId);
    /**
     * 先从redis缓存中取user 如果没有再从数据库中取
     * @return
     */
    void saveUserToRedis(User user);
    /**
     * 先从redis缓存中移除用户数据
     * @return
     */
    void removeUserFromRedis(String userId);


    /**
     * 新增或保存用户信息
     * @param openId
     * @param subscribe
     * @return
     */
    UserDto saveOrUpdateUser(String openId,Integer subscribe);

    /**
     * 处理微信小程序登录
     * @param openId
     * @param sessionKey
     * @return
     */
    UserDto wxMiniprogramLogin(String openId,String sessionKey,String shareUserId);

    /**
     * 如果传入的用户信息中不存在nanoid将缓存中的 nanoid填充到用户信息中
     * @param user
     * @return
     */
    User fillNaoid(User user);


    /**
     * 处理pc用户扫码登录回调
     * @param openid
     * @param access_token
     * @param refresh_token
     * @param headimgurl
     * @param nickname
     * @return
     */
    User processWxQrcodeLoginCallBack(String openid, String access_token, String refresh_token, String headimgurl, String nickname);

    /**
     * 微信第三登录 通过code获取access_token后登录
     * @return
     */
    UserDto wxLogin(GetAccessTokenParams params);
    /**
     * 根据微信openid和客户端名称查询或创建用户 当用户不存在时创建用户
     * @return
     */
    User getOrCreateUserByWxOpenId(String clientName, WxUserInfo userInfo, WxAccessTokenResult accessToken );
    /**
     * 注销用户
     * @return
     */
    boolean logoffByUserId(String userId);

    /**
     * aikeyboard根据用户id获取用户信息不会更新token
     * @return
     */
    UserDto kbGetUserinfoById(String userId);

    /**
     * 根据用户id和客户端名称获取用户信息
     * @return
     */
    User getUserByUserIdAndClientName(String clientName, String userId);

    /**
     * 重置签到
     * @return
     */
    boolean resetQiandao();



    /**
     * 修改密码
     * @return
     */
    boolean updatePwd(String pwdNew, String pwdOld,String userId);

    /**
     * 检查密码
     * @return
     */
    Integer checkPwd(String pwd);

    /**
     * 修改flag
     * @return
     */
    Integer updateFlag(Integer flag);

    /**
     * 获取当前用户 从token中获取到userId然后从缓存或数据库获取
     * @return
     */
    User getTokenUser();


}
